package com.manager.commons.utils;

//                   _ooOoo_    
//                  o8888888o    
//                  88" . "88    
//                  (| -_- |)    
//                   O\ = /O    
//               ____/'---'\____    
//              /. '\\| : |//' .\    
//             // \\||| : |||// \\   
//            // _|||||-:-|||||_ \\    
//           // | | \\\ - /// | | \\
//           || |_| ''\---/'' |_| || 
//            \ .-\___/'-'\___/-. /    
//          ___\. .' /--.--\ '. ./___    
//        .""'< `.___\_<|>_/___.' >'"".    
//       | |: `- \`.|'\ _ /'|.`/ -` :| |    
//        \ \ `-. \_ __\ /__ _/ .-` / /    
//======'-.___`-.___\_______/___.-`___.-'======    
//                   '=---='    
//.................................................    
//写一哈代码，你就青叫唤；信龟儿设计，你逗是傻逼。
//永无Bug，啷个可能！求佛主保佑也没球用！

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import org.apache.commons.lang3.StringUtils;

/**
 * 中国移动 网络：GSM、TD-SCDMA 134号段：1340、1341、1342、1343、1344、1345、1346、1347、1348、1349
 * 135号段：1350、1351、1352、1353、1354、1355、1356、1357、1358、1359
 * 136号段：1360、1361、1362、1363、1364、1365、1366、1367、1368、1369
 * 137号段：1370、1371、1372、1373、1374、1375、1376、1377、1378、1379
 * 138号段：1380、1381、1382、1383、1384、1385、1386、1387、1388、1389
 * 139号段：1390、1391、1392、1393、1394、1395、1396、1397、1398、1399
 * 147号段：1470、1471、1472、1473、1474、1475、1476、1477、1478、1479
 * 150号段：1500、1501、1502、1503、1504、1505、1506、1507、1508、1509
 * 151号段：1510、1511、1512、1513、1514、1515、1516、1517、1518、1519
 * 152号段：1520、1521、1522、1523、1524、1525、1526、1527、1528、1529
 * 157号段：1570、1571、1572、1573、1574、1575、1576、1577、1578、1579
 * 158号段：1580、1581、1582、1583、1584、1585、1586、1587、1588、1589
 * 159号段：1590、1591、1592、1593、1594、1595、1596、1597、1598、1599
 * 182号段：1820、1821、1822、1823、1824、1825、1826、1827、1828、1829
 * 187号段：1870、1871、1872、1873、1874、1875、1876、1877、1878、1879
 * 188号段：1880、1881、1882、1883、1884、1885、1886、1887、1888、1889
 * 
 * 中国联通 网络：GSM、WCDMA 130号段：1300、1301、1302、1303、1304、1305、1306、1307、1308、1309
 * 131号段：1310、1311、1312、1313、1314、1315、1316、1317、1318、1319
 * 132号段：1320、1321、1322、1323、1324、1325、1326、1327、1328、1329
 * 145号段：1450、1451、1452、1453、1454、1455、1456、1457、1458、1459
 * 155号段：1550、1551、1552、1553、1554、1555、1556、1557、1558、1559
 * 156号段：1560、1561、1562、1563、1564、1565、1566、1567、1568、1569
 * 185号段：1850、1851、1852、1853、1854、1855、1856、1857、1858、1859
 * 186号段：1860、1861、1862、1863、1864、1865、1866、1867、1868、1869
 * 
 * 中国电信 网络：CDMA、CDMA2000 133号段：1330、1331、1332、1333、1334、1335、1336、1337、1338、1339
 * 153号段：1530、1531、1532、1533、1534、1535、1536、1537、1538、1539
 * 189号段：1890、1891、1892、1893、1894、1895、1896、1897、1898、1899
 * 
 * @author H
 * @version V1.0
 */
public class TeleUtil {

	private static final String TELE_START13 = "13";
	private static final String TELE_START14 = "14";
	private static final String TELE_START15 = "15";
	private static final String TELE_START16 = "16";
	private static final String TELE_START17 = "17";
	private static final String TELE_START18 = "18";
	private static final String TELE_START19 = "19";

	private static final String TELE_START_CN = "86";
	private static final String TELE_START_CN2 = "+86";

	/** 移动 联通 */
	public static final String MOBILE_NUMBER_PATTERN = "^1((3[0-9]{1})|(4[57]{1})|(5[012356789]{1})|(8[256789]{1}))\\d{8}$";

	/** 移动 */
	public static final String MOBILE_NO_PATTERN = "^1((3[4-9]{1})|(4[7]{1})|(5[012789]{1})|(8[278]{1}))\\d{8}$";

	/** 联通 */
	public static final String UNION_NO_PATTERN = "^1((3[0-2]{1})|(4[5]{1})|(5[56]{1})|(7[6]{1})|(8[56]{1}))\\d{8}$";

	/** 联通座机 */
	public static final String UNION_PHONE_PATTERN = "^8{1}[0-9]{7}";

	/**
	 * 验证手机号的合法性
	 * @param tele
	 * @return
	 */
	public static boolean isRightTele(String tele) {
		if (StringUtils.isBlank(tele)) {
			return false;
		}
		tele = TeleUtil.trim86TeleNo(tele);
		tele = tele.trim();
		int len = tele.length();
        return len == 11 && (tele.startsWith(TELE_START13) || tele.startsWith(TELE_START14)
                || tele.startsWith(TELE_START15) || tele.startsWith(TELE_START16) || tele.startsWith(TELE_START17)
                || tele.startsWith(TELE_START18) || tele.startsWith(TELE_START19));
    }

	private static Pattern mobilePattern = null;

	/**
	 * 移动号码
	 * @param tele
	 * @return
	 */
	public static boolean isMobilePhone(String tele) {
		if (StringUtils.isBlank(tele)) {
			return false;
		}
		if (mobilePattern == null) {
			mobilePattern = Pattern.compile(MOBILE_NO_PATTERN);
		}
		return mobilePattern.matcher(tele).matches();
	}

	private static Pattern unionPattern = null;

	/**
	 * 联通号码
	 * @param tele
	 * @return
	 */
	public static boolean isUnionPhone(String tele) {
		if (StringUtils.isBlank(tele)) {
			return false;
		}
		if (unionPattern == null) {
			unionPattern = Pattern.compile(UNION_NO_PATTERN);
		}
		return unionPattern.matcher(tele).matches();
	}

	private static Pattern unionPhonePattern = null;

	/**
	 * 联通座机号码
	 * @param tele
	 * @return
	 */
	public static boolean isUnionTele(String tele) {
		if (StringUtils.isBlank(tele)) {
			return false;
		}
		if (unionPhonePattern == null) {
			unionPhonePattern = Pattern.compile(UNION_PHONE_PATTERN);
		}
		return unionPhonePattern.matcher(tele).matches();
	}

	/**
	 * 去掉86 +86
	 * @param teleNo
	 * @return
	 */
	public static String trim86TeleNo(String teleNo) {
		if (StringUtils.isBlank(teleNo)) {
			return null;
		}
		if (teleNo.startsWith(TELE_START_CN)) {
			return teleNo.substring(2);
		} else if (teleNo.startsWith(TELE_START_CN2)) {
			return teleNo.substring(3);
		} else {
			return teleNo;
		}
	}

	/**
	 * ^ 匹配输入字符串开始的位置 \d 匹配一个或多个数字，其中 \ 要转义，所以是 \\d $ 匹配输入字符串结尾的位置
	 */
	private static final Pattern HK_PATTERN = Pattern.compile("^(5|6|8|9)\\d{7}$");
	private static final Pattern CHINA_PATTERN = Pattern
			.compile("^((13[0-9])|(14[0,1,4-9])|(15[0-3,5-9])|(16[2,5,6,7])|(17[0-8])|(18[0-9])|(19[0-3,5-9]))\\d{8}$");
	private static final Pattern NUM_PATTERN = Pattern.compile("[0-9]+");

	/**
	 * 大陆号码或香港号码均可
	 */
	public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
		return isChinaPhoneLegal(str) || isHKPhoneLegal(str);
	}

	/**
	 * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数<br/>
	 * 此方法中前三位格式有：<br/>
	 * 13+任意数<br/>
	 * 145,147,149<br/>
	 * 15+除4的任意数(不要写^4，这样的话字母也会被认为是正确的)<br/>
	 * 166<br/>
	 * 17+3,5,6,7,8<br/>
	 * 18+任意数<br/>
	 * 198,199<br/>
	 */
	public static boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
		Matcher m = CHINA_PATTERN.matcher(str);
		return m.matches();
	}

	/**
	 * 香港手机号码8位数，5|6|8|9开头+7位任意数
	 */
	public static boolean isHKPhoneLegal(String str) throws PatternSyntaxException {
		Matcher m = HK_PATTERN.matcher(str);
		return m.matches();
	}

	/**
	 * 判断是否是正整数的方法
	 */
	public static boolean isNumeric(String string) {
		return NUM_PATTERN.matcher(string).matches();
	}
}